﻿using System;
using System.Collections.Generic;
using Common.Builders.Interfaces;
using Common.Entities;
using DataAccess.Accessors.Interfaces;
using DataAccess.Converters;
using DataAccess.DAO;
using DataAccess.Repository.Interfaces;

namespace DataAccess.Repository
{
    public class UserAccountRepository : IUserAccountRepository
    {
        private readonly IUserAccountAccessor _userAccountAccessor;
        private readonly IUserAccountEntityConverter _userAccountEntityConverter;
        private readonly ISocialNetworkRepository _socialNetworkRepository;
        private readonly IUserAccountBuilder _userAccountBuilder;
        private readonly ISocialNetworkAccessor _socialNetworkAccessor;

        public UserAccountRepository(IUserAccountAccessor userAccountAccessor,
                                     IUserAccountEntityConverter userAccountEntityConverter,
                                     ISocialNetworkRepository socialNetworkRepository,
                                     IUserAccountBuilder userAccountBuilder,
                                     ISocialNetworkAccessor socialNetworkAccessor)
        {
            _userAccountAccessor = userAccountAccessor;
            _userAccountEntityConverter = userAccountEntityConverter;
            _socialNetworkRepository = socialNetworkRepository;
            _userAccountBuilder = userAccountBuilder;
            _socialNetworkAccessor = socialNetworkAccessor;
        }

        public UserAccounts GetUserAccounts(long userId)
        {
            var userAccounts = new UserAccounts();

            var userAccountsDao = _userAccountAccessor.GetUserAccountForUser(userId);

            if (userAccountsDao != null && userAccountsDao.Count > 0)
            {
                foreach(var userAccountDao in userAccountsDao)
                {
                    var socialNetwork = _socialNetworkRepository.GetByNetworkId(userAccountDao.SocialNetworkId);
                    var userAccount = _userAccountEntityConverter.ConvertToEntity(userAccountDao);
                    userAccounts.Add(_userAccountBuilder.WithUserAccount(userAccount)
                                            .WithSocialNetwork(socialNetwork).Build());
                }
            }
            return userAccounts;
        }

        public void SaveUserAccounts(long userId, UserAccounts userAccounts)
        {
            foreach (var userAccount in userAccounts.Accounts)
            {
                var socialNetwork = _socialNetworkAccessor.GetNetworkByName(userAccount.SocialNetwork.SocialNetworkName.ToString());
                if (socialNetwork == null)
                    continue;

                var currentAccountDao = _userAccountEntityConverter.ConvertToEntityDAO(userAccount);
                currentAccountDao.SocialNetworkId = socialNetwork.SocialNetworkId;
                currentAccountDao.UserId = userId;
                _userAccountAccessor.SaveUserAccount(currentAccountDao);
            }
        }

        public void RemoveUserAccount(User user)
        {
            throw new NotImplementedException();
        }
    }
}
